import org.apache.commons.lang3.StringUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Author zhangkaiqiang
 * @Date 2019/9/26  20:34
 * @Description MD5工具类，用于对数据进行MD5加密
 *
 *
 *MD5即信息摘要算法,
 */
public class MD5Util {


	/**
	 * 	16进制的所有可以表示的数
	 */
	private static final String HEXDIGITS[] = { "0", "1", "2", "3", "4", "5",
			"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };


	/***
	 * @Author zhangkaiqiang
	 * @Description TODO
	 * @Date 21:27 2019/9/26 
	 * @param 
	 * @param message
	 * @return java.lang.String
	 * 字符串进行md5加密
	 **/
	public static String mD5Encode(String message){
		String resultString = null;
		if(StringUtils.isNotBlank(message)){
			try {
				//1 创建一个提供信息摘要算法的对象，初始化为md5算法对象
				MessageDigest md = MessageDigest.getInstance("MD5");
				//3 计算后获得字节数组,这就是那128位了
				byte[] buff = md.digest(message.getBytes());
				//4 把数组每一字节（一个字节占八位）换成16进制连成md5字符串
				resultString = bytesToHexString(buff);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
		}else{
			throw new RuntimeException("message must not null or empty");
		}
		return resultString;
	}


	/**
	 * 把二进制转换为16进制的字符串
	 * @param bytes
	 * @return
	 */
	public static String bytesToHexString(byte[] bytes){
		StringBuilder resultSb = new StringBuilder();
		for (int num : bytes) {
			if(num<0){
				num= num+256;
			}
			int d1 = num / 16;
			int d2 = num % 16;
			resultSb.append(HEXDIGITS[d1]).append(HEXDIGITS[d2]);
		}
		return resultSb.toString();
	}


	public static void main(String[] args) {
		System.out.println(mD5Encode("1111111"));
	}
}
